package com.chenwc.util;

import com.chenwc.enumeration.LocaleLanguage;
import com.chenwc.enumeration.TranslateSoftware;
import com.chenwc.util.fileutil.ReadFile;
import com.chenwc.util.translate.baidu.TranslateByBaiDuUtil;
import com.chenwc.util.translate.baidu.enumeration.BaiDuDomain;
import com.chenwc.util.translate.baidu.enumeration.BaiDuLang;
import com.chenwc.util.translate.google.v3.GoogleTranslateV3Utils;
import com.chenwc.util.translate.google.v3.SupportedLanguagesV3Code;
import com.chenwc.util.translate.youdao.TranslateByYouDaoUtil;
import com.chenwc.util.translate.youdao.enumeration.YouDaoDomain;
import com.chenwc.util.translate.youdao.enumeration.YouDaoLang;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 工具类
 *
 * @author chenwc
 * @package com.chenwc.util
 * @project wso2-sinicization
 * @date 2024/5/25
 */
public class Util {
    private static final Logger log = LoggerFactory.getLogger(Util.class);

    /**
     * 判断字符串是否为空
     *
     * @param string 输入字符串
     * @return 为空返回true，不为空返回false
     */
    public static boolean isEmpty(String string) {
        return null == string || string.isEmpty();
    }

    /**
     * 把翻译之后的中文字符替换为英文字符
     * 中文括号、双引号、句号，感叹号，问号、冒号、逗号
     * 大括号左右两侧加一个空格
     *
     * @param value 需要进行替换的字符串
     * @return 替换后的字符串
     */
    public static String valueReplace(String value) {

        return value.replace("（", "(").replace("）", ")")
                .replace("。", ".").replace("“", "\"")
                .replace("”", "\"").replace("！", "!")
                .replace("？", "?").replace("：", ":")
                .replace("｛", "{").replace("｝", "}")
                .replace("，", ",").replace("【", "[")
                .replace("】", "]");
    }

    /**
     * 根据不同的翻译软件进行翻译
     *
     * @param val               需要翻译的文本
     * @param translateSoftware 翻译软件
     * @param localeLanguage    多语言，需要翻译成哪国语言
     * @return 翻译后的文本
     */
    public static String getValueByTranslateSoftware(String val, TranslateSoftware translateSoftware, LocaleLanguage localeLanguage) {
        String cntext = "";
        switch (translateSoftware) {
            case BAIDU:
                //百度翻译
                cntext = TranslateByBaiDuUtil.translate(val, BaiDuLang.EN, LocaleLanguage.changeLocaleLanguage2BaiDuLang(localeLanguage), BaiDuDomain.IT);
                break;
            case YOUDAO:
                //有道智云
                cntext = TranslateByYouDaoUtil.translate(val, YouDaoLang.ENGLISH, LocaleLanguage.changeLocaleLanguage2YouDaoLang(localeLanguage), YouDaoDomain.COMPUTERS);
                //调节访问速率
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                break;
            case GOOGLE:
                cntext = GoogleTranslateV3Utils.translateText(val, SupportedLanguagesV3Code.EN, SupportedLanguagesV3Code.ZH_CN);
                break;
        }
        return cntext;
    }

    /**
     * 获取英文翻译为中文后的值
     *
     * @param val               需要翻译的文本
     * @param translateSoftware 翻译软件
     * @return 翻译后的文本
     */
    public static String getTranslateValue(String val, TranslateSoftware translateSoftware) {
        String cntext = "";
        try {
            cntext = getValueByTranslateSoftware(val, translateSoftware);
        } catch (Exception e1) {
            // TODO 自动生成的 catch 块
            e1.printStackTrace();
            try {
                Thread.sleep(20000);
                cntext = getValueByTranslateSoftware(val, translateSoftware);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        return cntext;
    }

    /**
     * 根据不同的翻译软件进行中译英
     *
     * @param val               需要翻译的文本
     * @param translateSoftware 翻译软件
     * @return 翻译后的文本
     */
    public static String getValueByTranslateSoftware(String val, TranslateSoftware translateSoftware) {
        String cntext = "";
        switch (translateSoftware) {
            case BAIDU:
                //百度翻译
                cntext = TranslateByBaiDuUtil.translate(val, BaiDuLang.EN, BaiDuLang.ZH, BaiDuDomain.IT);
                break;
            case YOUDAO:
                //有道智云
                cntext = TranslateByYouDaoUtil.translate(val, YouDaoLang.ENGLISH, YouDaoLang.CHINESE, YouDaoDomain.COMPUTERS);
                break;
            case GOOGLE:
                cntext = GoogleTranslateV3Utils.translateText(val, SupportedLanguagesV3Code.EN, SupportedLanguagesV3Code.ZH_CN);
                break;
        }
        return cntext;
    }


    /**
     * 获取md5加密的字符串
     *
     * @param string 输入字符串
     * @return 加密后的字符串
     */
    public static String getMd5(String string) {
        return DigestUtils.md5Hex(string);
    }

    /**
     * 获取文件的md5值
     *
     * @param file 输入文件
     * @return 加密后的字符串
     */
    public static String getFileMd5(File file) {
        return DigestUtils.md5Hex(ReadFile.readFileToByteArray(file));
    }

    /**
     * 搜索ui_jar文件
     *
     * @param dirPath 输入文件夹
     * @return 搜索到的ui_jar文件列表
     */
    public static List<String> searchUiFileList(String dirPath) {
        List<String> filelist = new ArrayList<>();
        File f = new File(dirPath);
        if (!f.exists()) {
            log.info(dirPath + " 不存在");
            return new ArrayList<>();
        }
        Collection<File> fileCollection = FileUtils.listFiles(f, new String[]{"jar"}, true);
        if (null == fileCollection) {
            throw new RuntimeException("文件夹：" + f.getAbsolutePath() + " 文件列表为null！");
        }
        for (File file : fileCollection) {
            if (file.isDirectory()) {
                log.debug(file.getAbsolutePath() + " 是[目录]");
            } else {
                String path = file.getAbsolutePath();
                if (path.contains("ui_") && !path.contains("_1.jar")) {
                    filelist.add(path);
                }
                if (path.contains("ui.") && !path.contains("_1.jar")) {
                    filelist.add(path);
                }
                if (path.contains("i18n")) {
                    filelist.add(path);
                }
            }
        }
        //对filelist进行去重
        filelist = filelist.stream().distinct().collect(Collectors.toCollection(ArrayList::new));
        return filelist;
    }

    /**
     * 搜索Resources.properties国际化i18n文件
     *
     * @param dirPath 输入文件夹
     * @return 搜索到的Resources.properties国际化i18n文件列表
     */
    public static List<String> searchResourcesPropertiesFileList(String dirPath) {
        List<String> filelist = new ArrayList<>();
        File f = new File(dirPath);
        if (!f.exists()) {
            log.info(dirPath + " 不存在");
            return new ArrayList<>();
        }
        Collection<File> fileCollection = FileUtils.listFiles(f, new String[]{"properties"}, true);
        if (null == fileCollection) {
            throw new RuntimeException("文件夹：" + f.getAbsolutePath() + " 文件列表为null！");
        }
        for (File file : fileCollection) {
            if (file.isDirectory()) {
                log.debug(file.getAbsolutePath() + " 是[目录]");
            } else {
                String path = file.getAbsolutePath();
                if (path.contains("Resources") && path.contains("i18n")) {
                    filelist.add(path);
                }
            }
        }
        return filelist;
    }

    /**
     * 搜索i18n的en.json文件
     *
     * @param dirPath 输入文件夹
     * @return 搜索到的i18n的en.json文件列表
     */
    public static List<String> searchEnJsonFileList(String dirPath) {
        List<String> filelist = new ArrayList<>();
        File f = new File(dirPath);
        if (!f.exists()) {
            log.info(dirPath + " 不存在");
            return new ArrayList<>();
        }
        Collection<File> fileCollection = FileUtils.listFiles(f, new String[]{"json"}, true);
        if (null == fileCollection) {
            throw new RuntimeException("文件夹：" + f.getAbsolutePath() + " 文件列表为null！");
        }
        for (File file : fileCollection) {
            if (file.isDirectory()) {
                log.debug(file.getAbsolutePath() + " 是[目录]");
            } else {
                String path = file.getAbsolutePath();
                if (path.contains("locales") && file.getName().contains("en")) {
                    filelist.add(path);
                }
                if (path.contains("en-US")){
                    filelist.add(path);
                }
            }
        }
        //对filelist进行去重
        filelist = filelist.stream().distinct().collect(Collectors.toCollection(ArrayList::new));
        return filelist;
    }
}
